#include "linklist.h"
#include <stdio.h>
#include <stdlib.h>

Node *initList()
{
    Node *head = (Node *)malloc(sizeof(Node)); // 创建头节点
    if (head == NULL)
    {
        printf("内存分配失败！\n");
        exit(1);
    }
    head->data = 0;    // 数据域初始化为 0
    head->next = NULL; // 指针域初始化为 NULL
    return head;
}

void headInsert(Node *head, int data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (newNode == NULL)
    {
        printf("内存分配失败！\n");
        exit(1);
    }
    newNode->data = data;       // 设置数据域
    newNode->next = head->next; // 新节点指向当前的第一个节点
    head->next = newNode;       // 头节点指向新节点
}

void tailInsert(Node *head, int data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (newNode == NULL)
    {
        printf("内存分配失败！\n");
        exit(1);
    }
    newNode->data = data;
    newNode->next = NULL;

    Node *temp = head;
    while (temp->next != NULL)
    { // 找到最后一个节点
        temp = temp->next;
    }
    temp->next = newNode; // 将新节点接到链表尾部
}

void traverseList(Node *head)
{
    Node *temp = head->next; // 跳过头节点
    while (temp != NULL)
    {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

void deleteHead(Node *head)
{
    if (head->next == NULL)
    { // 链表为空
        printf("链表为空，无法删除！\n");
        return;
    }

    Node *toDelete = head->next;
    head->next = toDelete->next; // 头节点指向第二个节点
    free(toDelete);              // 释放内存
}

void deleteTail(Node *head)
{
    if (head->next == NULL)
    { // 链表为空
        printf("链表为空，无法删除！\n");
        return;
    }

    Node *temp = head;
    while (temp->next->next != NULL)
    { // 找到倒数第二个节点
        temp = temp->next;
    }

    free(temp->next);  // 释放尾节点
    temp->next = NULL; // 将倒数第二个节点的指针置为 NULL
}

void deleteAtPosition(Node *head, int pos)
{
    if (pos < 0)
    {
        printf("位置非法！\n");
        return;
    }

    Node *temp = head;
    for (int i = 0; i < pos && temp->next != NULL; i++)
    {
        temp = temp->next; // 找到目标位置的前一个节点
    }

    if (temp->next == NULL)
    {
        printf("位置超出范围！\n");
        return;
    }

    Node *toDelete = temp->next;
    temp->next = toDelete->next; // 跳过目标节点
    free(toDelete);              // 释放内存
}

void freeList(Node *head)
{
    Node *temp;
    while (head != NULL)
    {
        temp = head;
        head = head->next;
        free(temp);
    }
}
